// 包含主窗口头文件
#include "mainwindow.h"
// 包含UI表单文件
#include "ui_mainwindow.h"
// 包含RTC4实现头文件
#include "RTC4impl.h"
// 包含Qt消息框
#include <QMessageBox>
// 包含Qt线程
#include <QThread>
// 包含Qt并发
#include <QtConcurrent/QtConcurrent>
// 包含Qt调试
#include <QDebug>

/**
 * @brief MainWindow类构造函数
 * @param parent 父窗口指针
 *
 * 初始化UI界面，加载RTC校正文件和程序文件，
 * 配置激光模式和时序参数，并启动标记循环线程
 */
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    short   ErrorCode;

    printf("Polygon Marking with a CO2 laser\n\n");

    // 初始化RTC系统
    // 加载校正文件
    ErrorCode = load_correction_file("./cor_1to1.ctb",
                                     1,          // 使用默认校正表#1
                                     1.0, 1.0,   // 缩放因子
                                     0.0,        // 旋转角度(度，逆时针)
                                     0.0, 0.0);  // 偏移量(位)
    if(ErrorCode) {
        QMessageBox::critical(this, "错误", QString("校正文件加载失败: %1").arg(ErrorCode));
        return;
    }
    
    // 加载程序文件
    ErrorCode = load_program_file("./RTC4D2.hex");
    if(ErrorCode) {
        QMessageBox::critical(this, "错误", QString("程序文件加载失败:%1").arg(ErrorCode));
        return;
    }
    
    // 配置激光模式为CO2
    set_laser_mode(2);
    // 设置待机参数
    set_standby(100*8,      // 待机周期的一半(1/8微秒)
                8);         // 脉冲宽度(1/8微秒)

    // 配置时序、延迟和速度预设
    set_start_list(1);
    // 设置激光时序
    set_laser_timing(100,   // 激光信号周期的一半
                     50,50,  // LASER1和LASER2的脉冲宽度
                     0);     // 时基(0对应1微秒)
    // 设置扫描器延迟
    set_scanner_delays(10,  // 跳转延迟(10微秒)
                       10,     // 标记延迟(10微秒)
                       10);     // 多边形延迟(10微秒)
    // 设置激光延迟
    set_laser_delays(1,   // 激光开启延迟(微秒)
                     1);   // 激光关闭延迟(微秒)
    // 设置矩阵变换
    set_matrix(0, 1, -1, 0);
    // 设置原点位置
    home_position(0, 0);
    // 结束列表设置
    set_end_of_list();
    // 执行列表
    execute_list(1);

    // 使用QtConcurrent启动标记循环线程
    QtConcurrent::run(this, &MainWindow::runLoop, 32000);
}

/**
 * @brief MainWindow类析构函数
 *
 * 释放UI资源
 */
MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::checkSpace(int* num)
{
    ushort spaceNum = 0;
    if(*num >= 4000){
        // 检查列表空间
        do{
            spaceNum = get_list_space();
            qDebug() << QString("num=%1, 空间数量: %3").arg(*num).arg(spaceNum);
            QThread::msleep(500);
        }while(spaceNum < 4000);
        *num = 0;
    }
    return true;
}

/**
 * @brief 标记循环处理函数
 * @param R 半径参数
 * @param Y Y轴参数
 *
 * 实现多边形标记的循环逻辑，控制激光标记速度和位置
 */
void MainWindow::runLoop(short R)
{
    set_list_mode(1);
    bool k = true;
    int num = 0;
    // 主循环
    for(int i = 0; i < R; i++){
        // 写入DA值
        write_da_1(11);
        num++;
        if(!checkSpace(&num)){
            return;
        }
        // 设置标记速度
        set_mark_speed(800);
        num++;
        if(!checkSpace(&num)){
            return;
        }
        // 计算标记位置
        short a = R * (k ? 1 : -1);
        // 绝对位置标记
        mark_abs(a, a);
        num++;
        if(!checkSpace(&num)){
            return;
        }
        // 切换方向
        k = !k;
        qDebug() << QString("循环: %1, 数量: %2").arg(i).arg(num);
    }
    // 结束列表
    set_end_of_list();
}

